package com.shen.library_nettysocket.interf

import com.shen.library_nettysocket.MsgDispatcher
import com.shen.library_nettysocket.listener.IMSConnectStatusCallback
import com.shen.library_nettysocket.listener.OnEventListener
import com.shen.library_nettysocket.protobuf.MessageProtobuf
import com.shen.library_nettysocket.timer.MsgTimeoutTimerManager
import java.util.*

/**
 * ims抽象接口，需要切换到其它方式实现im功能，实现此接口即可
 */
interface IMSClientInterface {
    /**
     * 初始化
     * [serverUrlList]  服务器地址·列表 </br>
     * [listener]       与「应用层」交互的「listener」 </br>
     * [callback]       ims「连接状态」回调
     */
    fun init(serverUrlList: Vector<String?>?, listener: OnEventListener?, callback: IMSConnectStatusCallback?)

    /** 从「应用层」获取「网络·是否可用」 */
    val isNetworkAvailable: Boolean

    /** 获取「重连间隔」时长 */
    val reconnectInterval: Int
    /** 获取「连接超时」时长 */
    val connectTimeout: Int
    /** 获取 应用层「消息发送·超时」重发·次数 */
    val resendCount: Int
    /** 获取 应用层「消息发送·超时」重发·间隔 */
    val resendInterval: Int

    /** 获取 应用在「前台」时「心跳间隔」时间 */
    val foregroundHeartbeatInterval: Int
    /** 获取 应用在「后台」时「心跳间隔」时间 */
    val backgroundHeartbeatInterval: Int

    /** 获取 应用层「消息·发送·状态报告」消息类型 */
    val serverSentReportMsgType: Int
    /** 获取 应用层「消息·接收·状态报告」消息类型 */
    val clientReceivedReportMsgType: Int


    /** 重置·连接，也就是重连 -- 「首次连接」也可认为是「重连」 */
    fun resetConnect()

    /**
     * 重置连接，也就是重连 -- 「首次连接」也可认为是「重连」
     * 重载 -- [isFirst]是否·首次连接
     */
    fun resetConnect(isFirst: Boolean)

    /** 关闭连接，同时「释放资源」 */
    fun close()

    /** 标识ims「是否·已关闭」 */
    val isClosed: Boolean

    /** 发送消息 [msg] */
    fun sendMsg(msg: MessageProtobuf.Msg?)
    /**
     * 发送消息[msg]
     * 重载 -- [isJoinTimeoutManager] 是否加入「发送超时」管理器
     */
    fun sendMsg(msg: MessageProtobuf.Msg?, isJoinTimeoutManager: Boolean)

    /** 设置app [appStatus]前后台状态 */
    fun setAppStatus(appStatus: Int)

    /** 获取 由「应用层」构造的「握手消息」 */
    val handshakeMsg: MessageProtobuf.Msg?
    /** 获取 由「应用层」构造的「心跳消息」 */
    val heartbeatMsg: MessageProtobuf.Msg?

    /** 获取「消息·转发器」 */
    val msgDispatcher: MsgDispatcher?

    /** 获取「消息发送·超时」定时器 */
    val msgTimeoutTimerManager: MsgTimeoutTimerManager?
}